<?php

	require_once(dirname(__FILE__) . '/../controllers/news.php');
	require_once(dirname(__FILE__) . "/../controllers/user.php");
	require_once(dirname(__FILE__) . "/../controllers/calendari.php");
	require_once('db_cfg.php');
	
	

    class DbDriver{
		
		public function db_getNews(){
			$array_news=null;
			$db_array_news = $this->execute_query('select NewsId, Data, Titolo, Corpo from news order by Data Desc');
			for($i=0;$i<count($db_array_news);$i++){
				$array_news[$i] = new News(
					$db_array_news[$i][0],
					$db_array_news[$i][1],
					$db_array_news[$i][2],
					$db_array_news[$i][3]
					);
			}
			return $array_news;
		}
		

		public function addNews($titolo, $corpo){
			global $address_db, $user_db, $pwd_db, $nome_db; 
			$con = mysql_connect($address_db, $user_db, $pwd_db); //crea una connessione per usare la funzione di escape
			$data = date("Y-m-d H:i:s");
			$titolo = mysql_real_escape_string($titolo, $con);
			$corpo = mysql_real_escape_string($corpo,$con);
			mysql_close($con);
			$query = sprintf("insert into news (Titolo, Corpo, Data) values ('%s', '%s', '%s')", $titolo, $corpo, $data);
			$this->execute_non_query($query);

			

		}
		
		public function db_deleteNews($NewsId){
			$this->execute_non_query("delete from news where NewsId=$NewsId");
		}
		
		public function db_getUsers(){
			$query = "select UsersId, Nome, Cognome, Alias, Email, RoleId, Password, Attivo from utenti";
			$db_utente = $this->execute_query($query);
			$users = Array();
			for($i=0;$i<count($db_utente);$i++){
				array_push($users, new User(
					$db_utente[$i][0],
					$db_utente[$i][1],
					$db_utente[$i][2],
					$db_utente[$i][3],
					$db_utente[$i][4],
					$db_utente[$i][5],
					$db_utente[$i][6],
					$db_utente[$i][7]
				));
			}
			return $users;
		}
		
		public function db_getUserById($id){
			$query = sprintf("select UsersId, Nome, Cognome, Alias, Email, RoleId, Password, Attivo from utenti where UsersId = %d", $id);
			$db_utente = $this->execute_query($query);
			return new User(
					$db_utente[0][0],
					$db_utente[0][1],
					$db_utente[0][2],
					$db_utente[0][3],
					$db_utente[0][4],
					$db_utente[0][5],
					$db_utente[0][6],
					$db_utente[0][7]
				);			
		}
		
		public function db_getUser($user_name, $user_password){
		/*Prende in input il nome utente e la sua password in chiaro e se sono corretti
		 * restituisce un oggetto User o NULL se non lo trova  */
			global $address_db, $user_db, $pwd_db, $nome_db; 
			$con = mysql_connect($address_db, $user_db, $pwd_db); //crea una connessione per usare la funzione di escape
			$utente=null;
			//crea la stringa della query
			$query = sprintf("select UsersId, Nome, Cognome, Alias, Email, RoleId, Password, Attivo from utenti " .
			" where Alias = '%s' And Password = '" . $this->getHashedPwd($user_password) . "'" .
			" /*And Attivo = 1*/ ", mysql_real_escape_string($user_name,$con));
			mysql_close($con);
			$db_utente = $this->execute_query($query);
			if(count($db_utente) > 0){
				
				$utente = new User(
					$db_utente[0][0],
					$db_utente[0][1],
					$db_utente[0][2],
					$db_utente[0][3],
					$db_utente[0][4],
					$db_utente[0][5],
					$db_utente[0][6],
					$db_utente[0][7]
				);
			}
			
			return $utente;
		}
		
		public function db_changeUserPassword($user_id, $new_md5_pwd){
			$query = sprintf("update utenti set Password = '%s' where UsersId = %d", $new_md5_pwd, $user_id);
			$this->execute_non_query($query);
		}
		
		public function db_getRuoliUtente(){
			return $this->execute_query("select RoleId, RoleDesc from ruoli order by RoleId");
		}
		
		public function saveUser($user){
		/* salva i dettagli dell'utente */
			$query = sprintf("update utenti set
				Nome='%s',
				Cognome='%s',
				alias = '%s',
				email = '%s',
				attivo = %d,
				RoleId = %d
				where UsersId = %d", mysql_escape_string($user->getNome()),
					mysql_escape_string($user->getCognome()),
					mysql_escape_string($user->getAlias()),
					mysql_escape_string($user->getEmail()),
					($user->isAbilitato() ? 1 : 0),
					$user->getRuolo(), $user->getId());
			$this->execute_non_query($query); 
		}

		public function insertUser($user){
		/* crea un nuovo utente  */
			$query = sprintf("insert into utenti (Nome, Cognome, alias, Email, Password, Attivo, RoleId)
			values ('%s','%s','%s','%s','%s',%d,%d)", mysql_escape_string($user->getNome()),
				mysql_escape_string($user->getCognome()),
				mysql_escape_string($user->getAlias()),
				mysql_escape_string($user->getEmail()),
				$this->getHashedPwd('password_1'),
				($user->isAbilitato() ? 1 : 0), $user->getRuolo());
			$this->execute_non_query($query); 
		}

		public function getHashedPwd($clear_pwd){
			return md5($clear_pwd);
		}

		public function getGiornate($lega){
		/* restituisce l'array delle giornate di questa lega */
			$query = "
				select distinct Giornata from calendario c inner join gestione_leghe gl on c.SquadraCasa = gl.GestioneId
				where gl.LegaId = $lega
				order by Giornata
			";
			return $this->execute_query($query);
		}
		
		public function getForumMessages($limit = false){
		/* Restituisce un array con tutti i messaggi della bachceca ordinati per data */
			$limite = "";
			if($limit == true) $limite = " LIMIT 50";
			$query = "SELECT Data, Alias, Commento FROM bacheca B inner join utenti U on " .
			"B.UserId = U.UsersId order by Data DESC " . $limite;
			return $this->execute_query($query);
		}
		
		public function addForumMessage($userId, $text){
		/* Inserisce un nuovo messaggio in bacheca */
			global $address_db, $user_db, $pwd_db, $nome_db; 
			$con = mysql_connect($address_db, $user_db, $pwd_db); //crea una connessione per usare la funzione di escape
			$query = sprintf("insert into bacheca (Data, UserId, Commento) values ('%s', $userId, '%s')",
				date("Y-m-d H:i:s"), mysql_real_escape_string($text,$con));
			mysql_close($con);
			$this->execute_non_query($query);
		}
		
		public function db_getSquadre($lega, $owner=true){
		/*Se owner=true allora carica le squadre appartenenti a questa lega,
		 * altrimenti tutte quelle che non le appartengono*/
		 $eq= $owner ? " In " : " Not In ";
			$query = sprintf("select  s.TeamId, NomeSquadra, Budget, Logo_img,
							concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.')  As Allenatore, u.UsersId As AllenatoreId
						from squadre s inner join utenti u on u.UsersId = s.UserId
						where s.TeamId %s (select TeamId from gestione_leghe where LegaId = %d)
						Order by s.TeamId", $eq, $lega);
			return $this->execute_query($query);
		}
		
		public function db_getTutteSquadre(){
		/*Restituisce tutte le squadre indipendentemente dalla lega cui appartengono*/
			$query = sprintf("select  s.TeamId, NomeSquadra, Budget, Logo_img,
							concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.')  As Allenatore, u.UsersId As AllenatoreId
						from squadre s inner join utenti u
							on u.UsersId = s.UserId
						Order by s.TeamId");
			return $this->execute_query($query);
		}
		
		public function db_getSquadreUtente($userId){
		/* restituisce tutte le squadre appartenenti a questo utente */
			$query = sprintf("select  s.TeamId, NomeSquadra, Budget, Logo_img,
							concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.')  As Allenatore, u.UsersId As AllenatoreId
						from squadre s inner join utenti u on u.UsersId = s.UserId
						where u.UsersId = %d
						Order by s.TeamId", $userId);
			return $this->execute_query($query);
		}


		public function db_getSquadra($idSquadra){
			$query = sprintf("select  s.TeamId, NomeSquadra, Budget, Logo_img,
							concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.')  As Allenatore, u.UsersId As AllenatoreId
						from squadre s inner join utenti u on u.UsersId = s.UserId
						where s.TeamId = %d", $idSquadra);
			return $this->execute_query($query);
		}
		
		public function saveTeam($squadra){
			/* aggiorna le informazion sulla squadra */
			$query = sprintf("update squadre set
				NomeSquadra = '%s',
				Budget = %f,
				Logo_Img = '%s',
				UserId = %d
				where TeamId = %d
			", $squadra->getNome(), $squadra->getBudget(), $squadra->getUrlImgLogo(), $squadra->getAllenatoreId(), $squadra->getId());
			echo $query;
			$this->execute_non_query($query);	
		}
		
		public function insertTeam($squadra){
			$query = sprintf("insert into squadre (NomeSquadra, Budget, Logo_Img, UserId) values ('%s', %f, '%s', %d)", 
				mysql_escape_string($squadra->getNome()), $squadra->getBudget(), 
				mysql_escape_string($squadra->getUrlImgLogo()), $squadra->getAllenatoreId());
			$this->execute_non_query($query);
		}
		
		public function db_getGiocatori($teamId, $stagione){
			//if($stagione=="") $stagione = Calendario::getStagione();
			$query = sprintf("select r.PlayerId, g.Nome, g.Ruolo, g.Squadra, r.costo, StatoDesc 
				from rose r inner join giocatori g on 	
 				 r.PlayerId = g.PlayerId 
 				inner join stato_giocatori sg on r.StatoId = sg.StatoId  
 				where r.TeamId = %d and r.stagione = '%s'
 				order by Ruolo Desc, r.StatoId, Costo Desc, Nome", $teamId, $stagione);
			return $this->execute_query($query); 
		}
		
		public function db_getNoGiocatori($teamId,$stagione){
			$query = sprintf("select g.PlayerId, g.Nome, g.Ruolo, g.Squadra, 0, 'F' As StatoDesc
				from giocatori g where g.PlayerId not in (
					select g.PlayerId   
					from rose r inner join giocatori g on 	
	 				 r.PlayerId = g.PlayerId 
	 				inner join stato_giocatori sg on r.StatoId = sg.StatoId
	 				where r.TeamId = %d and r.stagione = '%s'
	 			)
	 			and g.PlayerId < 1000
 				order by Ruolo Desc, Squadra, Nome", $teamId, $stagione);
			return $this->execute_query($query); 
		}
		
		public function db_getGiocatoriStat($ordinamento, $filtro, $idPlayer=0){
			if($ordinamento == null || $ordinamento == "") $ordinamento = ""; else $ordinamento = " order by " . $ordinamento;
			$playerFilter="";
			if($idPlayer>0) $playerFilter=" and g.PlayerId=$idPlayer";
			$query = sprintf("
				select
				g.PlayerId IdGiocatore,
				g.Ruolo,
				g.Nome,
				g.Squadra,
				coalesce(sum(Case When g.Ruolo = 'p' Then -v.GolSubito Else v.GolFatto End),0) As Gol,
				coalesce(sum(Ammonizione),0) Ammonizioni,
				coalesce(Sum(Espulsione),0) Espulsioni,
				coalesce(Avg(Voto),0) As MediaVoto,
				coalesce(Avg(Voto + GolFatto * 3 + GolSubito * -1 + RigoreParato * 3 + RigoreSbagliato * -3 + RigoreSegnato * 2 + Autorete * -3 + Ammonizione * -0.5 + Espulsione * -1 + Assist),0) As MediaFantaVoto,
				coalesce((Select Voto From voti where IdGiocatore = v.IdGiocatore and GiornataA = Max(v.GiornataA)),0) As VotoGMeno0,
				coalesce((Select Voto From voti where IdGiocatore = v.IdGiocatore and GiornataA = Max(v.GiornataA) - 1),0) As VotoGMeno1,
				coalesce((Select Voto From voti where IdGiocatore = v.IdGiocatore and GiornataA = Max(v.GiornataA) - 2),0) As VotoGMeno2,
				coalesce((Select Voto From voti where IdGiocatore = v.IdGiocatore and GiornataA = Max(v.GiornataA) - 3),0) As VotoGMeno3,
				coalesce((Select Voto From voti where IdGiocatore = v.IdGiocatore and GiornataA = Max(v.GiornataA) - 4),0) As VotoGMeno4,
				coalesce((Select Voto From voti where IdGiocatore = v.IdGiocatore and GiornataA = Max(v.GiornataA) - 5),0) As VotoGMeno5,
				coalesce(count(v.IdGiocatore),0) As Giocate,
				(Select coalesce(max(GiornataA),0) from voti where stagione = '%s') As UltimaGiornata
				from voti v right join giocatori g on v.IdGiocatore = g.PlayerId
				and v.stagione = '%s' where ('' = '%s' or g.ruolo = '%s')
				and g.PlayerId < 1000
				%s /*eventuale filtro del campo PlayerId*/
				group by g.PlayerId
				%s", Calendario::getStagione(), Calendario::getStagione(), $filtro, $filtro, $playerFilter, $ordinamento);
				//			echo $query;
				//if($idPlayer==222) echo $query;
			return $this->execute_query($query);

		}
		
		public function db_getClassifica($intTipo, $lega = 1){
		/* Restituisce la classifica di una certa competizione (campionato, coppa girone A, coppa girone B, ecc) */
			$query  = sprintf(
			"SELECT concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.')  As Allenatore, s.NomeSquadra, c.Punti, c.Gareggiate, c.Vinte, c.Sconfitte, c.Nulle,
			c.GolFatti, c.GolSubiti, c.DifferenzaReti, c.MediaVoto, c.TotaleVoto, comp.CompetizioneDesc, l.LegaDesc
			FROM classifica c inner join gestione_leghe gl on c.GestioneLegheId = gl.GestioneId
		      inner join squadre s on gl.TeamId = s.TeamId
			inner join utenti u on u.UsersId = s.UserId
			inner join competizione comp on c.CompetizioneId = comp.CompetizioneId
      		inner join leghe l on gl.LegaId = l.LegaId
			where c.CompetizioneId = %d and gl.LegaId = %d
			order by Punti Desc, TotaleVoto Desc, NomeSquadra", $intTipo, $lega);
			return $this->execute_query($query);
		}
		
		public function db_aggiornaClassifica($quale, $lega_id){
			$query = sprintf("
				update classifica 
				, (

					select GestioneLegaId, CompetizioneId, NomeSquadra,
					Sum(Case When Vittoria > 0 Then 3 When Vittoria = 0 Then 1 Else 0 End) As Punti,
					Sum(Case When Not Voto is null Then 1 Else 0 End) As Gareggiate,
					Sum(Case When Vittoria > 0 Then 1 Else 0 End) As Vinte,
					Sum(Case When Vittoria < 0 Then 1 Else 0 End) As Sconfitte,
					Sum(Case When Vittoria = 0 Then 1 Else 0 End) As Nulle,
					Sum(GolFatti) As GolFatti,
					Sum(GolSubiti) As GolSubiti,
					Sum(GolFatti) - Sum(GolSubiti) As DifferenzaReti,
					Avg(Voto) As MediaVoto,
					Sum(Voto) As TotaleVoto

					from (
				
						select  c.Giornata, c.GiornataA, c.SquadraCasa As GestioneLegaId, s.NomeSquadra, c.CompetizioneId, 
						c.VotoCasa As Voto, c.GolCasa As GolFatti, c.GolOspite As GolSubiti, c.GolCasa - c.GolOspite As Vittoria from
						calendario c inner join gestione_leghe gl on c.SquadraCasa = gl.GestioneId
						inner join squadre s on gl.TeamId = s.TeamId
						where gl.LegaId = %d
				
						union all
				
						select  c.Giornata, c.GiornataA, c.SquadraOspite As GestioneLegaId, s.NomeSquadra, c.CompetizioneId,
						c.VotoOspite As Voto, c.GolOspite As GolFatti, c.GolCasa As GolSubiti, c.GolOspite - c.GolCasa As Vittoria from
						calendario c inner join gestione_leghe gl on c.SquadraOspite = gl.GestioneId
						inner join squadre s on gl.TeamId = s.TeamId
						where gl.LegaId = %d
					) H
				
					group by GestioneLegaId, NomeSquadra, CompetizioneId
				) C
				
				
				set
					classifica.Punti = C.Punti,
					classifica.Gareggiate = C.Gareggiate,
					classifica.Vinte = C.Vinte,
					classifica.Sconfitte = C.Sconfitte,
					classifica.Nulle = C.Nulle,
					classifica.GolFatti = C.GolFatti,
					classifica.GolSubiti = C.GolSubiti,
					classifica.DifferenzaReti = C.DifferenzaReti,
					classifica.MediaVoto = C.MediaVoto,
					classifica.TotaleVoto = C.TotaleVoto
				where classifica.GestioneLegheId = C.GestioneLegaId and classifica.CompetizioneId = C.CompetizioneId
			", $lega_id, $lega_id);
			$this->execute_non_query($query);
		}
		
		public function db_getCalendarioLega($lega_id){
			
			$query = sprintf(
			"
				SELECT
					Giornata, GiornataA, 
					sCasa.TeamId IdSquadraCasa, sCasa.NomeSquadra NomeSquadraCasa, concat(uCasa.Cognome, ' ', substring(uCasa.Nome,1,1), '.') AllenatoreCasa,
					coalesce(VotoCasa, '-') VotoCasa, coalesce(GolCasa, '0') GolCasa,
					sOspite.TeamId IdSquadraOspite, sOspite.NomeSquadra NomeSquadraOspite, concat(uOspite.Cognome, ' ', substring(uOspite.Nome,1,1), '.') AllenatoreOspite,
					coalesce(VotoOspite,'-') VotoOspite, coalesce(GolOspite,'0') GolOspite,
					CompetizioneDesc,
          			l.LegaDesc,
          			l.LegaId,
          			l.CompetizioneId,
          			c.CalendarioId,
          			coalesce(c.Note, '') As Note
				FROM calendario c inner join gestione_leghe glCasa on c.SquadraCasa = glCasa.GestioneId
          			INNER JOIN squadre sCasa on sCasa.TeamId = glCasa.TeamId
					INNER JOIN utenti uCasa on uCasa.UsersID = sCasa.UserId
          			INNER JOIN gestione_leghe glOspite on c.SquadraOspite = glOspite.GestioneId
          			INNER JOIN squadre sOspite on sOspite.TeamId = glOspite.TeamId
					INNER JOIN utenti uOspite on uOspite.UsersId = sOspite.UserId
					INNER JOIN competizione comp on c.CompetizioneId = comp.CompetizioneId
          			INNER JOIN leghe l on glCasa.LegaId = l.LegaId
				WHERE l.LegaId = %d
				ORDER BY l.LegaId, Giornata, c.CompetizioneId, sCasa.NomeSquadra
			"
			,$lega_id);
			return $this->execute_query($query);
		} //end db_getCalendario
		
		
		public function db_getCalendarioGiornata($giornataA, $lega_id){
			
			$query = sprintf(
			"
				SELECT
					Giornata, GiornataA, 
					sCasa.TeamId IdSquadraCasa, sCasa.NomeSquadra NomeSquadraCasa, concat(uCasa.Cognome, ' ', substring(uCasa.Nome,1,1), '.') AllenatoreCasa,
					coalesce(VotoCasa, '-') VotoCasa, coalesce(GolCasa, '0') GolCasa,
					sOspite.TeamId IdSquadraOspite, sOspite.NomeSquadra NomeSquadraOspite, concat(uOspite.Cognome, ' ', substring(uOspite.Nome,1,1), '.') AllenatoreOspite,
					coalesce(VotoOspite,'-') VotoOspite, coalesce(GolOspite,'0') GolOspite,
					CompetizioneDesc,
		        	l.LegaDesc,
		        	l.LegaId,
		        	l.CompetizioneId,
		        	c.CalendarioId,
		        	coalesce(c.Note, '') As Note
				FROM calendario c inner join gestione_leghe glCasa on c.SquadraCasa = glCasa.GestioneId
					INNER JOIN squadre sCasa on sCasa.TeamId = glCasa.TeamId
					INNER JOIN utenti uCasa on uCasa.UsersId = sCasa.UserId
					
					INNER JOIN gestione_leghe glOspite on c.SquadraOspite = glOspite.GestioneId
					INNER JOIN squadre sOspite on sOspite.TeamId = glOspite.TeamId
					INNER JOIN utenti uOspite on uOspite.UsersId = sOspite.UserId
					
					INNER JOIN competizione comp on c.CompetizioneId = comp.CompetizioneId
					INNER JOIN leghe l on glCasa.LegaId = l.LegaId
				WHERE GiornataA = (%d) and l.LegaId = %d
				ORDER BY l.LegaId, Giornata, c.CompetizioneId Desc, sCasa.NomeSquadra
			"
			,$giornataA, $lega_id);
			return $this->execute_query($query);
		} //end db_getCalendario
		
		public function db_getVoti($giornataA){
			$query = sprintf("select g.Nome, g.Ruolo, v.* from voti v inner join giocatori g on v.IdGiocatore = g.PlayerId
								where v.GiornataA = %d and v.stagione = '%s'", $giornataA, Calendario::getStagione());
			return $this->execute_query($query);
		}
		
		public function db_getFormazioneDefinitiva($teamId, $giornataA){
		/* Restituisce la formazione per questa giornata. Utilizzata solo dal calcolo
		 * dei risultati perchè non filtra lo stato del calciatore nella rosa*/
			$query = sprintf("
				select r.PlayerId, g.Ruolo, g.Nome, g.Squadra, 
				    coalesce(pf.PosizioneId, 5) As PosizioneId, coalesce(pf.PosizioneDesc, 'TRIBUNA') as PosizioneDesc,
				    $giornataA As GiornataA, 
				    s.NomeSquadra,
				    concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.') As Allenatore,
				    (select max(Data) from team_activity ta where ta.TeamId = r.TeamId and GiornataA = %d) As UltimaModifica,
				    NULL NextGiornataA,
					0 As MediaVoto
				from rose r left outer join formazione f 
				    on r.TeamId = f.TeamId and r.Stagione = f.Stagione
				        and r.PlayerId = f.PlayerId and f.GiornataA = %d
				    inner join squadre s on r.TeamId = s.TeamId
				    inner join utenti u on s.UserId = u.UsersId
				    inner join giocatori g on r.PlayerId = g.PlayerId
				    left outer join posizione_formazione pf on f.PositionId = pf.PosizioneId
				 where r.TeamId = %d and r.Stagione = '%s'
				order by Ruolo desc, PosizioneId, Nome
			", $giornataA, $giornataA, $teamId, Calendario::getStagione());			
			return $this->execute_query($query);
		}
		
		public function db_getFormazione($teamId, $giornataA){
		/* Restituisce la formazione per questa giornata */
		//Controlla prima di tutto se esiste la formazione per questa giornata
		$passed_day = $giornataA;
		$query = sprintf("select count(*) N from formazione f inner join squadre s on f.TeamId = s.TeamId
			where f.TeamId = %d and GiornataA = %d and f.stagione = '%s'",$teamId , $giornataA, Calendario::getStagione());
			$arr = $this->execute_query($query);
			if(count($arr) == 0 || $arr[0][0] == 0){
				//cerca se ce ne � una precedente
				$arr = $this->execute_query(sprintf("
					select GiornataA, count(*) N from formazione f inner join squadre s on f.TeamId = s.TeamId
					where f.TeamId = %d and GiornataA < %d and f.stagione = '%s'
					group by GiornataA
					order by GiornataA desc
					limit 1
				", $teamId, $giornataA, Calendario::getStagione()));
				if($arr == null || count($arr) == 0 || $arr[0][1] == 0){
					//se non c'è prende come formazione la rosa intera con tutti titolari
					$arr = $this->getPrimaFormazione($teamId);
					return $arr;
				}else{ //se la trova per� prende come giornata di riferimento questa
					$giornataA = $arr[0][0];
				}
			}
			/*$query = sprintf("
				  select f.PlayerId, g.Ruolo, g.Nome, g.Squadra, pf.PosizioneId, pf.PosizioneDesc,
					 f.GiornataA, s.NomeSquadra, concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.') As Allenatore,
					(select max(Data) from team_activity ta where ta.TeamId = f.TeamId and GiornataA = %d) As UltimaModifica,
					(select min(GiornataA) from calendario where VotoCasa is null) NextGiornataA,
          			Round((Select coalesce(Avg(Voto),0) from voti v where v.IdGiocatore = f.PlayerId), 2) As MediaVoto
				  from formazione f inner join giocatori g on f.PlayerId = g.PlayerId
					inner join posizione_formazione pf on f.PositionId = pf.PosizioneId
					inner join squadre s on s.TeamId = f.TeamId
					inner join rose r on g.PlayerId = r.PlayerId and f.TeamId = r.TeamId and f.stagione = r.stagione
				    inner join utenti u on u.UsersId = s.UserId
				  where f.TeamId = %d and f.GiornataA = %d  and r.stagione = '%s'
					order by g.Ruolo desc, pf.PosizioneId, g.Nome
			", $passed_day, $teamId, $giornataA, Calendario::getStagione());*/
			
			$query = sprintf("
				select r.PlayerId, g.Ruolo, g.Nome, g.Squadra, 
				    coalesce(pf.PosizioneId, 5) As PosizioneId, coalesce(pf.PosizioneDesc, 'TRIBUNA') as PosizioneDesc,
				    $giornataA As GiornataA, 
				    s.NomeSquadra,
				    concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.') As Allenatore,
				    (select max(Data) from team_activity ta where ta.TeamId = r.TeamId and GiornataA = %d) As UltimaModifica,
				    (select min(GiornataA) from calendario where VotoCasa is null) NextGiornataA,
					Round((Select coalesce(Avg(Voto),0) from voti v where v.IdGiocatore = f.PlayerId), 2) As MediaVoto
				from rose r left outer join formazione f 
				    on r.TeamId = f.TeamId and r.Stagione = f.Stagione
				        and r.PlayerId = f.PlayerId and f.GiornataA = %d
				    inner join squadre s on r.TeamId = s.TeamId
				    inner join utenti u on s.UserId = u.UsersId
				    inner join giocatori g on r.PlayerId = g.PlayerId
				    left outer join posizione_formazione pf on f.PositionId = pf.PosizioneId
				 where r.TeamId = %d and r.Stagione = '%s' And r.StatoId = 'A'
				order by Ruolo desc, PosizioneId, Nome
			", $passed_day, $giornataA, $teamId, Calendario::getStagione());			
			return $this->execute_query($query);
		}
		private function getPrimaFormazione($teamId){
		/* */ 
			$query = sprintf("
				select r.PlayerId, g.Ruolo, g.Nome, g.Squadra, 0 As PositionsId, 'TITOLARE' As PosizioneDesc,
				 1 As GiornataA, s.NomeSquadra, concat(u.Cognome, ' ', substring(u.Nome, 1, 1), '.') As Allenatore,
				NULL As UltimaModifica,
				  1 As NextGiornataA
				from rose r inner join giocatori g on r.PlayerId = g.PlayerId
				inner join squadre s on r.TeamId = s.TeamId
				inner join utenti u on u.UsersId = s.UserId
				 where s.TeamId = %d and r.StatoId = 'A'  and r.stagione = '%s'
				order by g.Ruolo desc, r.PlayerId
			", $teamId, Calendario::getStagione());
			$prima = $this->execute_query($query);
			/* sistema le posizioni nella prima formazione*/
			if($prima == null) return null; //la squadra no ha una rosa
			$prima[0][4]=Formazione::$TITOLARE; //PORTIERI
			$prima[1][4]=Formazione::$RISERVA_1;
			$prima[2][4]=Formazione::$TRIBUNA;
			$prima[3][4]=Formazione::$TITOLARE; //DIFENSORI
			$prima[4][4]=Formazione::$TITOLARE;
			$prima[5][4]=Formazione::$TITOLARE;
			$prima[6][4]=Formazione::$RISERVA_1;
			$prima[7][4]=Formazione::$RISERVA_2;
			$prima[8][4]=Formazione::$TRIBUNA;
			$prima[9][4]=Formazione::$TRIBUNA;
			$prima[10][4]=Formazione::$TRIBUNA;
			$prima[11][4]=Formazione::$TITOLARE;
			$prima[12][4]=Formazione::$TITOLARE; //CENTROCAMPISTI
			$prima[13][4]=Formazione::$TITOLARE;
			$prima[14][4]=Formazione::$TITOLARE;
			$prima[15][4]=Formazione::$RISERVA_1;
			$prima[16][4]=Formazione::$RISERVA_2;
			$prima[17][4]=Formazione::$TRIBUNA;
			$prima[18][4]=Formazione::$TRIBUNA;
			$prima[19][4]=Formazione::$TRIBUNA;
			$prima[20][4]=Formazione::$TITOLARE; //ATTACCANTI
			$prima[21][4]=Formazione::$TITOLARE;
			$prima[22][4]=Formazione::$TITOLARE;
			$prima[23][4]=Formazione::$RISERVA_1;
			$prima[24][4]=Formazione::$RISERVA_2;
			return $prima;
		}
		
		public function aggiornaFormazione($formazione){
		/* Salva la formazione per questa giornata aggiungendo le righe (prima cancella quelle eventualmente esistenti)*/
			global $address_db, $user_db, $pwd_db, $nome_db; 
			$con = mysql_connect($address_db, $user_db, $pwd_db); //crea una connessione per usare la funzione di escape
			$query = sprintf("delete from formazione where TeamId = %d and GiornataA = %d and stagione = '%s';\n",
				$formazione->getSquadraId(), $formazione->getGiornata(), Calendario::getStagione());
			//adesso, per ogni calciatore aggiunge la sua posizione
			foreach($formazione->getAllPlayers() as $p){
				$query = $query . sprintf("insert into formazione (PlayerId,PositionId,GiornataA,TeamId,Stagione) values " .
				"(%d, %d, %d, %d,'%s');\n",
				$p->getId(), $p->getFormazione(), $formazione->getGiornata(), $formazione->getSquadraId(), Calendario::getStagione()); 
			}
			$this->execute_non_query($query);
			//inserisce una riga nella tabella  team_activity con la nuova formazione appena inserita
			$query = sprintf("insert into team_activity (UserId, TeamId, GiornataA, Formazione) values" . 
			"(%d, %d, %d, '%s');\n", 
				User::getCurrentUser()->getId(), 
				$formazione->getSquadraId(),
				$formazione->getGiornata(), 
				mysql_real_escape_string($formazione->serializza(), $con)
			);
			//esegue tutte le istruzioni
			mysql_close($con);
			$this->execute_non_query($query);
		}

		public function caricaVoti($voti){
		//Array di oggetti VotoCalciatore
			$giornataA = $voti[0]->giornataA;
			$stagione = Calendario::getStagione();
			$query = sprintf("delete from voti where GiornataA = %d and stagione = '%s'", $giornataA, $stagione);
			$insQuery = "";
			$baseInsQuery = "Insert Into voti (GiornataA, IdGiocatore, Voto, GolFatto, GolSubito,RigoreParato, RigoreSbagliato, RigoreSegnato,
			Autorete, Ammonizione, Espulsione, Assist, AssistFermo, Gdv, Stagione) values ";
			$this->execute_non_query($query);
			foreach($voti as $voto){
				$query = sprintf("%s (%d, %d, '%s', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, '%s')",
					$baseInsQuery, 
					$voto->giornataA, 
					$voto->id,
					$voto->voto,
					$voto->golFatto,
					$voto->golSubito,
					$voto->rigoreParato,
					$voto->rigoreSbagliato,
					$voto->rigoreSegnato,
					$voto->autorete,
					$voto->ammonizione,
					$voto->espulsione,
					$voto->assist,
					$voto->assist_fermo,
					$voto->gdv,
					$stagione
				);
				$insQuery = $insQuery . $query . ";\n";
			}
			//Inserisce tutti i voti
			
			$this->execute_non_query($insQuery);
		}


		public function aggiornaQuotazione($c){
		/*Aggiorna la quotazione di un calciatore*/
			$query = sprintf("select nome from giocatori where PlayerId = %d limit 1", $c->getId());
			$res = $this->execute_query($query);
			$nome_db = $res[0][0];
			$query = sprintf("select count(*) from giocatori where PlayerId = %d", $c->getId());
			$res = $this->execute_query($query);
			$trovato = $res[0][0];
			if($trovato > 0){
				if($nome_db == $c->getNome()){
					$query= sprintf("update giocatori set Quotazione = %f, squadra = '%s' where PlayerId = %d",
						$c->getQuotazione(), $c->getSquadra(), $c->getId());
					$this->execute_non_query($query);
				}else{
					return -1; //errore: nome del giocatore non corrispondente
				}
			}else{
				$stagione = Calendario::getStagione();
				$query = sprintf("insert into giocatori (PlayerId, Squadra, Nome, Ruolo, Quotazione, Stagione) values (%d, '%s', '%s', '%s', %f, '%s')"
					, $c->getId(), $c->getSQuadra(), $c->getNome(), $c->getRuolo(), $c->getQuotazione(), $stagione);
				$this->execute_non_query($query);
				return 2; //giocatore inserito
			}
			return 1; // quotazione aggiornata
			
		}
		
		public function salvaGiornata($giornata){
		/* salva sul DB i risultati di questa giornata */
			$up_query = '';
			for($i=0; $i<$giornata->getNumScontri(); $i++){
				$scontro = $giornata->getScontro($i);
				$up_query = sprintf("
				update calendario 
					set VotoCasa = %f,
					GolCasa = %d,
					VotoOspite = %f,
					GolOspite = %d
				where CalendarioId = %d;
				", $scontro->getVotoCasa(),
				$scontro->getGolCasa(),
				$scontro->getVotoOspite(),
				$scontro->getGolOspite(),
				$scontro->getIdScontro());
				$this->execute_non_query($up_query);	
			} //end for
		}
		
		public function db_getLeghe(){
			$query = "Select LegaId, Stagione, LegaDesc, Attiva, CompetizioneId from leghe order by Attiva desc, Stagione desc, LegaDesc";
			return $this->execute_query($query);
		}
		
		public function getIdPrimaLega(){
		/* restituisce l'id la lega attiva con id minimo*/
			$query = "Select Min(LegaId) LegaId from leghe where Attiva = 1";
			$arr = $this->execute_query($query);
			return $arr[0][0];	
		}
		
		public function getUltimaGiornata($legaId){
		/* Restituisce l'ultima giornata giocata per questa lega*/
			$query = sprintf("select coalesce(max(Giornata), 1) As UltimaGiornata from calendario c inner join gestione_leghe gl
				on c.SquadraCasa = gl.GestioneId
				where gl.LegaId = %d and VotoCasa is not null", $legaId);
			$arr = $this->execute_query($query);
			return $arr[0][0];			
		}
		
		public function getUltimaFormazione($teamId, $stagione){
			$query = sprintf("select coalesce(max(GiornataA), 1) As UltimaGiornataFormazione from formazione
			where teamId = %d and stagione = '%s'", $teamId, $stagione);
			$arr = $this->execute_query($query);
			return $arr[0][0];
		}
		
		public function db_getLega($legaId){
			$query = "Select LegaId, Stagione, LegaDesc, Attiva, CompetizioneId from leghe 
				where LegaId = $legaId";
			return $this->execute_query($query);			
		}
		
		public function saveLeague($lega){
		/* salva i dettagli dell'utente */
			$query = sprintf("update leghe set
				LegaDesc ='%s',
				Stagione='%s',
				Attiva = %d
				where LegaId = %d", mysql_escape_string($lega->getNome()),
					mysql_escape_string($lega->getStagione()),
					($lega->isAttiva() ? 1 : 0), $lega->getLegaId());
			$this->execute_non_query($query); 
		}
		
		public function insertLeague($lega){
		/* crea un nuovo utente  */
			$query = sprintf("insert into leghe (LegaDesc, Stagione,Attiva,CompetizioneId)
			values ('%s','%s',%d, %d)", mysql_escape_string($lega->getNome()),
				mysql_escape_string($lega->getStagione()),
				($lega->isAttiva() ? 1 : 0),
				$lega->getCompetizione());
			$this->execute_non_query($query); 
		}
		
		public function addTeamToLeague($legaId, $teamId){
			$query = sprintf("insert into gestione_leghe (LegaId, TeamId) values (%d, %d)", $legaId, $teamId);
			$this->execute_non_query($query);
		}
		
		public function rmTeamToLeague($legaId, $teamId){
			$query = sprintf("delete from gestione_leghe where LegaId = %d and TeamId = %d", $legaId, $teamId);
			//var_dump($query);
			$this->execute_non_query($query);
		}
		
		public function changePlayerStatus($playerId, $teamId, $status){
			$query = sprintf("update rose set StatoId = '%s' where PlayerId = %d and TeamId=%d and stagione = '%s'",
			$status, $playerId, $teamId, Calendario::getStagione());
			$this->execute_non_query($query);
		}
		
		
		public function addPlayerToTeam($playerId, $teamId, $costo){
			$query = sprintf("insert into rose (PlayerId, TeamId, Costo, StatoId, Stagione) values(%d, %d, %f, 'A', '%s')",
			$playerId, $teamId, $costo, Calendario::getStagione());
			$this->execute_non_query($query);
		}
		
		public function db_getNextA(){
		/* Restituisce la prima giornata della seria A per la quale non � stato ancora calcolato
		 * un risultato nel calendario*/
			$query = "select min(GiornataA) from calendario where votoCasa is null";
			return $this->execute_query($query);
			
		}
		
		public function db_getBestPlayers($teamId, $giornataA){
			$query = sprintf("
				select g.PlayerId, g.Ruolo, g.Nome, g.Squadra,
				    cast(Case When Right(v.Voto, 1) = '*' Then 0 Else v.Voto End +
				    v.GolFatto * 3 + 
				    v.GolSubito * -1 +
				    v.RigoreParato * 3 +
				    v.RigoreSbagliato * -3 +
				    v.RigoreSegnato * 2 +
				    v.Autorete * -3 +
				    v.Ammonizione * -0.5 +
				    v.Espulsione * -1 +
				    v.Assist +
				    v.AssistFermo * 0.5 as decimal(5,2))
				As FantaVoto,
				v.Stagione
				
				from rose r inner join voti v 
				    on r.PlayerId = v.IdGiocatore
				inner join giocatori g
				    on r.PlayerId = g.PlayerId
				where r.TeamId = %d and r.StatoId = 'A' and r.stagione = '%s'
				and v.GiornataA = %d
				
				order by FantaVoto desc
			", $teamId, Calendario::getStagione(), $giornataA);
			return $this->execute_query($query);		
		}
		
		private function execute_query($query){
			$blnError=false;
			$array_result=null;
			$result=null;
			$riga = 0;
			global $address_db, $user_db, $pwd_db, $nome_db; //variabili importate dal file db_cfg.php
			try{
				$con = mysql_connect($address_db, $user_db, $pwd_db);
				
				mysql_select_db($nome_db, $con);
				//echo mysql_error($con);
				$result = mysql_query($query, $con);
				if(mysql_error($con) == ""){
					//echo "numero righe risultanti: " . mysql_num_rows($result) . "<br />\n";
					/*prima inserisce nell'array del risultato i nomi dei campi
					for($i=0; $i < count($row); $i++){
						$array_result[0][$i] = mysql_field_name($result, $i);
					}*/
					//poi inserisce tutte le righe
					while($row=mysql_fetch_array($result,MYSQLI_NUM)){
						//scrive la riga
						$array_result[$riga++] = $row;
							/*for($i=0; $i < count($row); $i++){
								$result_text = $result_text . $row[$i];
							}*/
					}				
				}else{
					echo "Errore query:  $query <br />" . mysql_error($con);
					$blnError = true;
				}
	
			}catch(Exception $ex){
				echo 'Sollevata eccezione: ' . $ex->getMessage();
				$blnError=true;
			}
			mysql_free_result($result);
			mysql_close($con);
			//if($blnError) throw new Exception($result_text);
			return $array_result;
			
		} //end execute_query()
		
		private function execute_non_query($query){
		/* Esegue una o pi� query di modifica separate da ; in una transazione
		 * restituisce true se la modifca � andata a buon fine e solleva un'eccezione
		 * se qualcosa � andata male */
			global $address_db, $user_db, $pwd_db, $nome_db;
			$conn = new mysqli($address_db, $user_db, $pwd_db);
			$conn->select_db($nome_db);
			$result=true;
			$thrown_ex=null;
			try{
				$conn->autocommit(false);
				foreach(explode(";\n", $query) as $q){
					if(strlen(trim($q))==0) continue;
					//echo "$q <br />";
					$result = $result & $conn->query($q);
					
					if(!$result){break; }
					//echo "<p>query da eseguire $q </p>";
					/*if(!$conn->multiquery($query)){
						$conn->rollback();
						echo "Execute_non_query - errore:" . $conn->error;
					}else{
						$conn->commit();
					}*/
				}
				if($result){
					$conn->commit();
					//echo "tutte le query eseguite";
				}else{
					//echo "qualcosa non � andatao bene: " . $conn->error;
					$conn->rollback();
					$throw_ex = new Exception($conn->error);
				}
			}catch(Exception $ex){
				$thrown_ex = $ex;
			} 
			$conn->close();
			if($thrown_ex != null) throw $thrown_ex;
		}
    public function query_result($query){
    /*Esegue una query sul db e restituisce il risultato*/
		//Controlla prima di tutto se l'utente corrente � un super amministratore
		global $address_db, $user_db, $pwd_db, $nome_db;
		if(User::getCurrentUser()==null || User::getCurrentUser()->getRuolo()<User::$SA){
			echo "<p style='color:red;'>Errore: devi essere un super amministratore per eseguire questo comando</p>";
			return array();
		}else{
			$result_text="";
			$blnError=false;
			
			try{
				$con = mysql_connect($address_db, $user_db, $pwd_db);
				$alt = 0;
				mysql_select_db($nome_db, $con);
				echo mysql_error($con);
				$result = mysql_query($query, $con);
				if(mysql_error($con) == ""){
					echo "numero righe risultanti: " . mysql_num_rows($result) . "<br />\n";
					$result_text = "<table border='0' cellpadding='0' cellspacing='0'>";
					$written_col_names=false;
					while($row=mysql_fetch_array($result,MYSQLI_NUM)){
						//scrive le colonne
						$alt=(++$alt)%2;
						if(!$written_col_names){
							$result_text = $result_text . "<thead>";
							for($i=0; $i < count($row); $i++){
								$result_text = $result_text . "<td class='cellHeaderResult'>";
								$result_text = $result_text . mysql_field_name($result, $i);
								$result_text = $result_text . "</td>";
							}
							$result_text = $result_text . "</thead>";
							$written_col_names=true;
						}
						//scrive la riga
						$result_text = $result_text . "<tr>";
							for($i=0; $i < count($row); $i++){
								$result_text = $result_text . "<td class='cellResult alt_$alt'>";
								$result_text = $result_text . $row[$i];
								$result_text = $result_text . "</td>";
							}				
						$result_text = $result_text . "</tr>";
					}
					$result_text = $result_text . "</table>";				
				}else{
					$result_text = mysql_error($con);
					$blnError = true;
				}
	
			}catch(Exception $ex){
				$result_text = $ex->getMessage();
				$blnError=true;
			}
			mysql_free_result($result);
			mysql_close($con);
			if($blnError) throw new Exception($result_text);
			return $result_text;
		}
	}
    
    public function query_update($query){
    /*Esegue una query di aggiornamento sul db*/
		//Controlla prima di tutto se l'utente corrente � un super amministratore
		if(User::getCurrentUser()==null || User::getCurrentUser()->getRuolo()<User::$SA){
			echo "<p style='color:red;'>Errore: devi essere un super amministratore per eseguire questo comando</p>";
		}else{
			$this->execute_non_query($query);
		}
	}	
    }//end class
    
	


?>
